import config from '@/options'
import store from '@/store'
import axios from 'axios'
import { getToken, removeToken } from 'util/auth'
import { message } from './message/message'
import router from '@/router'

require('es6-promise').polyfill() // 浏览器兼容

const service = axios.create({
  baseURL: config.BASE_API,
  headers: { 'content-type': 'application/json' },
  timeout: 15000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(
  config => {
    // 让每个请求携带token
    if (store.getters.token) {
      config.headers['Authorization'] = getToken()
    }
    // table参数忽略
    if (config.method === 'post') {
      ignoreParameter(config.data)
      if (!config.headers.fileUpload) {
        config.data = JSON.stringify(config.data)
      }
    } else if (config.method === 'get') {
      ignoreParameter(config.params)
      config.params = {
        _t: Date.parse(new Date()) / 1000,
        ...config.params
      }
    }
    return config
  },
  error => {
    // request error
    console.log(error)
    Promise.reject(error)
  }
)

// 设置需要忽略的请求参数
function ignoreParameter (parameter) {
  // 忽略掉分页组件的展示布局属性
  if (parameter && parameter.layout) {
    parameter.layout = null
  }
  // 忽略掉分也组件的页面展示大小属性
  if (parameter && parameter.pageLimits) {
    parameter.pageLimits = null
  }
}

// respone拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.reLogin === true) {
      message.error('权限过期,重新登陆')
      // 权限失效重新登录
      store.dispatch('FedLogOut').then(() => {
        router.push('/login')
      })
    } else {
      return res
    }
  },
  error => {
    // 状态码拦截
    const errorData = error.response
    if (!errorData) {
      message.error('请稍后刷新再试')
      return
    }
    // 服务器发生异常
    if (errorData.status === 500) {
      message.error('服务器发生异常')
      store.commit('SET_USER_STATUS', errorData.status)
      router.push('/404')
    }
    // 网络超时
    if (errorData.status === 504) {
      message.error('网络超时')
    }
    // 请求错误
    if (errorData.status === 400) {
      message.error('请求错误')
    }
    // 地址错误
    if (errorData.status === 404) {
      message.error('请求地址错误')
      store.commit('SET_USER_STATUS', errorData.status)
      router.push('/404')
    }
    // 请求超时
    if (errorData.status === 408) {
      message.error('请求超时')
    }
    // 权限错误
    if (errorData.status === 401) {
      // 清除token信息
      if (getToken()) {
        removeToken()
      }
      message.error('权限异常,重新登陆')
      router.push('/login')
    }
    return Promise.reject(error)
  }
)
export default service

/**
 * get request
 * @param url
 * @param params
 * @returns {Promise}
 */
export function get (url, params = {}) {
  return new Promise((resolve, reject) => {
    service.get(url, { params: params }).then(response => {
      resolve(response)
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * post request
 * @param url
 * @param data
 * @param time 超时时间
 * @returns {Promise}
 */
export function post (url, data = {}, time) {
  return new Promise((resolve, reject) => {
    service.post(url, data, time)
      .then(response => {
        resolve(response)
      }, err => {
        reject(err)
      })
  })
}

/**
 * put request
 * @param url
 * @param data
 * @returns {Promise}
 */
export function put (url, data = {}) {
  return new Promise((resolve, reject) => {
    service.put(url, data)
      .then(response => {
        resolve(response)
      }, err => {
        reject(err)
      })
  })
}

/**
 * delete request
 * @param url
 * @param data
 * @returns {Promise}
 */
export function remove (url, data = {}) {
  return new Promise((resolve, reject) => {
    service.delete(url, data)
      .then(response => {
        resolve(response)
      }, err => {
        reject(err)
      })
  })
}
